package cn.imvc.app.models;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.stereotype.Service;

import cn.imvc.app.entities.GoodsSpec;
import cn.imvc.app.entities.GoodsSpecValue;
import cn.imvc.app.repositories.GoodsSpecValueRepository;
import cn.imvc.core.ModelUtil;
import cn.imvc.data.domain.ViewRequest;

@Service
public class GoodsSpecValueModelImpl implements GoodsSpecValueModel{

	@Autowired
	GoodsSpecValueRepository goodsSpecValueRepository;
	@Autowired
	GoodsImageModel goodsImageModel;
	
	public LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> getRequestMap() {
		// TODO Auto-generated method stub
		return null;
	}

	public Page<GoodsSpecValue> find(ViewRequest viewRequest) {
		return goodsSpecValueRepository.findAll(ModelUtil.OrderByIdDesc(viewRequest));
	}

	public GoodsSpecValue get(int id) {
		return goodsSpecValueRepository.findOne(id);
	}

	public GoodsSpecValue save(GoodsSpecValue goodsSpecValue) {
		return goodsSpecValueRepository.saveAndFlush(goodsSpecValue);
	}

	public GoodsSpecValue update(GoodsSpecValue goodsSpecValue) {
		return goodsSpecValueRepository.saveAndFlush(goodsSpecValue);
	}

	public void delete(int id) {
		goodsImageModel.deleteByGoodsSpecValue(get(id));
		goodsSpecValueRepository.delete(id);
	}

	public void deleteBatch(int[] ids) {
		for (int id : ids) {
			delete(id);
		}
	}
	
	public void Descartes(List<GoodsSpec> dimvalue, List<List<GoodsSpecValue>> result, int layer, List<GoodsSpecValue> goodsSpecValues)
    {
        //大于一个集合时：
        if (layer < dimvalue.size() - 1)
        {
            //大于一个集合时，第一个集合为空
            if (dimvalue.get(layer).getGoodsSpecValue().size() == 0)
            	Descartes(dimvalue, result, layer + 1, goodsSpecValues);
            else
            {
            	Iterator<GoodsSpecValue> iterator = dimvalue.get(layer).getGoodsSpecValue().iterator();
            	while (iterator.hasNext()) {
					GoodsSpecValue goodsSpecValue = (GoodsSpecValue) iterator.next();
					List<GoodsSpecValue> specValuesTmp = new ArrayList<GoodsSpecValue>();
					specValuesTmp.addAll(goodsSpecValues);
					specValuesTmp.add(goodsSpecValue);
					Descartes(dimvalue, result, layer + 1, specValuesTmp);
				}
            	
//                for (int i = 0; i < dimvalue.get(layer).getGoodsSpecValue().size(); i++)
//                {
//                    StringBuilder s1 = new StringBuilder();
//                    s1.append(curstring);
//                    s1.append(dimvalue.get(layer).getGoodsSpecValue().get(i));
//                    Descartes(dimvalue, result, layer + 1, s1.toString());
//                }
            }
        }
        //只有一个集合时：
        else if (layer == dimvalue.size() - 1)
        {
            //只有一个集合，且集合中没有元素
            if (dimvalue.get(layer).getGoodsSpecValue().size() == 0)
                result.add(goodsSpecValues);
            //只有一个集合，且集合中有元素时：其笛卡尔积就是这个集合元素本身
            else
            {
            	Iterator<GoodsSpecValue> iterator = dimvalue.get(layer).getGoodsSpecValue().iterator();
            	while (iterator.hasNext()) {
					GoodsSpecValue goodsSpecValue = (GoodsSpecValue) iterator.next();
					List<GoodsSpecValue> specValuesTmp = new ArrayList<GoodsSpecValue>();
					specValuesTmp.addAll(goodsSpecValues);
					specValuesTmp.add(goodsSpecValue);
					result.add(specValuesTmp);
				}
//                for (int i = 0; i < dimvalue.get(layer).size(); i++)
//                {
//                    result.add(curstring + dimvalue.get(layer).get(i));
//                }
            }
        }
    }

	public List<GoodsSpecValue> findBygoodsSpec(GoodsSpec goodsSpec) {
		return goodsSpecValueRepository.findByGoodsSpec(goodsSpec);
	}

	public void deleteByGoodsSpec(GoodsSpec goodsSpec) {
		List<GoodsSpecValue> goodsSpecValues = goodsSpecValueRepository.findByGoodsSpec(goodsSpec);
		Iterator<GoodsSpecValue> iterator = goodsSpecValues.iterator();
		while (iterator.hasNext()) {
			GoodsSpecValue goodsSpecValue = (GoodsSpecValue) iterator.next();
			goodsImageModel.deleteByGoodsSpecValue(goodsSpecValue);
		}
		goodsSpecValueRepository.deleteByGoodsSpec(goodsSpec);
	}

}
